package com.mercycrazy.springframework.context.annotation;

import cn.hutool.core.util.ClassUtil;
import com.mercycrazy.springframework.beans.factory.config.BeanDefinition;
import com.mercycrazy.springframework.stereotype.Component;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 处理对象扫描装配
 *
 * @author <a href="mailto:1443424326@qq.com">mercycrazy</a>
 * @since 2022-12-02
 */
public class ClassPathScanningCandidateComponentProvider {

    /**
     * 通过配置路径 basePackage 解析出 classes 生成 BeanDefinition 信息，
     * 通过该方法就可以扫描所有 basePackage 下使用 Component 注解的 Bean 对象
     *
     * @param basePackage 扫描的基础包路径
     * @return
     */
    public Set<BeanDefinition> findCandidateComponents(String basePackage) {
        Set<BeanDefinition> candidates = new LinkedHashSet<>();
        Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(basePackage, Component.class);
        for (Class<?> clazz : classes) {
            candidates.add(new BeanDefinition(clazz));
        }
        return candidates;
    }
}
